#include <asm/current.h>
/* set irq level. If an edge is detected, then the IRR is set to 1 */
-/* Caller must hold vpic lock */
static inline void pic_set_irq1(PicState *s, int irq, int level)
{
int mask;
- BUG_ON(!spin_is_locked(&s->pics_state->lock));
+ ASSERT(spin_is_locked(&s->pics_state->lock));
mask = 1 << irq;
if (s->elcr & mask) {
} else {
/* edge triggered */
if (level) {
- if ((s->last_irr & mask) == 0) {
+ if ((s->last_irr & mask) == 0)
s->irr |= mask;
- }
s->last_irr |= mask;
} else {
s->last_irr &= ~mask;
/* return the highest priority found in mask (highest = smallest
number). Return 8 if no irq */
-/* Caller must hold vpic lock */
static inline int get_priority(PicState *s, int mask)
{
int priority;
- BUG_ON(!spin_is_locked(&s->pics_state->lock));
+ ASSERT(spin_is_locked(&s->pics_state->lock));
if (mask == 0)
return 8;
}
/* return the pic wanted interrupt. return -1 if none */
-/* Caller must hold vpic lock */
static int pic_get_irq(PicState *s)
{
int mask, cur_priority, priority;
- BUG_ON(!spin_is_locked(&s->pics_state->lock));
+ ASSERT(spin_is_locked(&s->pics_state->lock));
mask = s->irr & ~s->imr;
priority = get_priority(s, mask);
/* raise irq to CPU if necessary. must be called every time the active
irq may change */
/* XXX: should not export it, but it is needed for an APIC kludge */
-/* Caller must hold vpic lock */
void pic_update_irq(struct hvm_virpic *s)
{
int irq2, irq;
- BUG_ON(!spin_is_locked(&s->lock));
+ ASSERT(spin_is_locked(&s->lock));
/* first look at slave pic */
irq2 = pic_get_irq(&s->pics[1]);
}
/* acknowledge interrupt 'irq' */
-/* Caller must hold vpic lock */
static inline void pic_intack(PicState *s, int irq)
{
- BUG_ON(!spin_is_locked(&s->pics_state->lock));
+ ASSERT(spin_is_locked(&s->pics_state->lock));
if (s->auto_eoi) {
if (s->rotate_on_auto_eoi)
}
} else {
/* spurious IRQ on host controller */
- printk("spurious IRQ irq got=%d\n",irq);
irq = 7;
intno = s->pics[0].irq_base + irq;
}
return intno;
}
-/* Caller must hold vpic lock */
static void update_shared_irr(struct hvm_virpic *s, PicState *c)
{
uint8_t *pl, *pe;
- BUG_ON(!spin_is_locked(&s->lock));
+ ASSERT(spin_is_locked(&s->lock));
get_sp(current->domain)->sp_global.pic_elcr =
s->pics[0].elcr | ((u16)s->pics[1].elcr << 8);
}
}
-/* Caller must hold vpic lock */
static void pic_reset(void *opaque)
{
PicState *s = opaque;
- BUG_ON(!spin_is_locked(&s->pics_state->lock));
+ ASSERT(spin_is_locked(&s->pics_state->lock));
s->last_irr = 0;
s->irr = 0;
s->rotate_on_auto_eoi = 0;
s->special_fully_nested_mode = 0;
s->init4 = 0;
-
- /* Initialise to level triggered mode, since Linux assumes that in
- a few places and it doesn't appear to break anything. */
- s->elcr = 0xff & s->elcr_mask;
+ /* Note: ELCR is not reset */
}
-/* Caller must hold vpic lock */
static void pic_ioport_write(void *opaque, uint32_t addr, uint32_t val)
{
PicState *s = opaque;
int priority, cmd, irq;
- BUG_ON(!spin_is_locked(&s->pics_state->lock));
+ ASSERT(spin_is_locked(&s->pics_state->lock));
addr &= 1;
if (addr == 0) {
}
}
-/* Caller must hold vpic lock */
static uint32_t pic_poll_read (PicState *s, uint32_t addr1)
{
int ret;
- BUG_ON(!spin_is_locked(&s->pics_state->lock));
+ ASSERT(spin_is_locked(&s->pics_state->lock));
ret = pic_get_irq(s);
if (ret >= 0) {
return ret;
}
-/* Caller must hold vpic lock */
static uint32_t pic_ioport_read(void *opaque, uint32_t addr1)
{
PicState *s = opaque;
unsigned int addr;
int ret;
- BUG_ON(!spin_is_locked(&s->pics_state->lock));
+ ASSERT(spin_is_locked(&s->pics_state->lock));
addr = addr1;
addr &= 1;
}
static void elcr_ioport_write(void *opaque, uint32_t addr, uint32_t val)
-/* Caller must hold vpic lock */
{
PicState *s = opaque;
- BUG_ON(!spin_is_locked(&s->pics_state->lock));
+ ASSERT(spin_is_locked(&s->pics_state->lock));
s->elcr = val & s->elcr_mask;
}
}
/* XXX: add generic master/slave system */
-/* Caller must hold vpic lock */
static void pic_init1(int io_addr, int elcr_addr, PicState *s)
{
- BUG_ON(!spin_is_locked(&s->pics_state->lock));
+ ASSERT(spin_is_locked(&s->pics_state->lock));
pic_reset(s);
}